# 将部分重复执行的代码块封装在函数中，再次执行这部分代码是，可以调用函数即可
# 定义函数
def sayHi():
    print("你好，我是小明")
    print("我今年21岁")
    print("我从事java开发工程师的工作")
    pass
# 调用函数
sayHi()
sayHi()
sayHi()

# 思考？如何在打招呼时，每个人输出的信息不同？
# 参数设计
def sayHello(name,age,work):
    """
    向他人介绍自己
    :param name: 姓名
    :param age: 年龄
    :param work: 工作
    :return:
    """
    print("你好，我是{}".format(name))
    print("我今年{}岁".format(age))
    print("我从事{}工作".format(work))
    pass
sayHello("tom",22,"python工程师")
sayHello("张三",28,"程序架构师")
# 必选参数在设计时，方法在调用过程中，要根据方法设计的参数进行传值
# sayHello() 此处会报错
######################## 参数设计#######################
#  缺省参数
def sum(a=9, b=20):
    print(a)
    print(b)
    print(a+b)
    pass
sum()
sum(5,12)
# 若必选参数与缺省参数同时存在，需要将缺省参数放在必选参数的后面
def sub(a,b=0):
    print(a-b)
    pass
sub(10)
sub(10,2)
# 可变参数（不定长参数）
def count(*args):
    print(type(args))
    sum=0
    for i in args:
        sum+=i
    print(sum)
    pass
count(1,5,6,9,10,22)
# 关键字参数,以key value进行传值，将参数封装在一个字典中
def showName(**kwargs):
    print(type(kwargs))
    pass
showName(name="tom",age=22)
student={"name":"tom","age":25}
# 若直接传递字典类型的参数，需要在参数前加上**
showName(**student)
# 没有返回值的函数，打印的结果为None值
print(showName())
# 返回值
def getName():
    return "张三"
# 有返回值的函数，可以接收返回值的结果
print(getName())
# 当返回值有多个的情况下
def returnName():
    return 1,2,3,4,5;
# 会将返回的内容封装在一个元祖中
print(returnName())
# 修改之前的计算操作，要求将参数与最终的运算结果一起返回
def getSum(*args):
    list1=[]
    sum=0
    for i in args:
        list1.append(i)
        sum+=i
        pass
    list1.append(sum)
    return list1
print(getSum(1,9,2,8))
# 函数的嵌套使用
def inner():
    print("inner函数开始")
    print("inner函数结束")
    pass
def outter():
    print("outter函数开始")
    inner()
    print("outter函数结束")
    pass
outter()

